// 给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串 的长度。

//  

// 示例 1:

// 输入: s = "abcabcbb"
// 输出: 3 
// 解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
// 示例 2:

// 输入: s = "bbbbb"
// 输出: 1
// 解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。
// 示例 3:

// 输入: s = "pwwkew"
// 输出: 3
// 解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
//      请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
//  

// 提示：

// 0 <= s.length <= 5 * 104
// s 由英文字母、数字、符号和空格组成

/**
 * @param {string} s
 * @return {number}
 */
 var lengthOfLongestSubstring = function(s) {
  let arr = new Set()
  let count = 0
  let k = 0
  for(let i=0;i<s.length;i++){
      if(arr.has(s.charAt(i))){
          arr.delete(s.charAt(i-1))
      }
      while(!arr.has(s.charAt(k)) && k<s.length){
          arr.add(s.charAt(k))
          ++k
      }
      count = Math.max(count,k-i)
  }
  return count
};
// 复盘
// 1、无重复字符应该考虑到用Set
// 2、采用滑动窗口的方法
//     使用k来记录首字符为i，字符串未重复时将字符加入arr
//     如果出现重复字符删除前面的字符，滑动窗口
//     对每个i开头的无重复字符串的数量进行对比
